/**
 * Copyright 2011 Joao Miguel Pereira
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package eu.jpereira.trainings.designpatterns.creational.builder;

import java.util.HashMap;
import java.util.Map;

import eu.jpereira.trainings.designpatterns.creational.builder.model.Report;
import eu.jpereira.trainings.designpatterns.creational.builder.model.SaleEntry;

/**
 * @author jpereira
 * 
 */
public class ReportAssembler
{

    private SaleEntry                                                 saleEntry;
    private final Map<String, Class<? extends AbstractReportBuilder>> builders;

    public ReportAssembler()
    {
        this.builders = new HashMap<String, Class<? extends AbstractReportBuilder>>();
    }

    /**
     * @param reportDate
     */
    public void setSaleEntry(SaleEntry saleEntry)
    {
        this.saleEntry = saleEntry;

    }

    public void registerBuilder(String type,
            Class<? extends AbstractReportBuilder> cls)
    {
        this.builders.put(type, cls);
    }

    /**
     * @param type
     * @return
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public Report getReport(String type) throws InstantiationException,
            IllegalAccessException
    {
        Report report = new Report();
        Class<? extends AbstractReportBuilder> builderClass = this.builders
                .get(type);
        if (builderClass == null)
        {
            return report;
        }
        AbstractReportBuilder builder = builderClass.newInstance();
        report.setReportBody(builder.buildReportBody(this.saleEntry));

        return report;
    }

}
